package com.crm.crm.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.crm.crm.domain.Dept;
import com.crm.crm.domain.SysDept;
import com.crm.crm.domain.SysUser;
import com.crm.crm.domain.vo.business.DeptNode;
import com.crm.crm.mapper.DeptMapper;
import com.crm.crm.mapper.SysDeptMapper;
import com.crm.crm.service.DeptService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

@Slf4j
@Service
public class DeptServicelmpl implements DeptService {
    @Autowired
    private DeptMapper deptMapper;

    @Autowired
    private SysDeptMapper sysDeptMapper;


    /**
     * 获取部门树用于 treeselect 组件，
     * 这是商机模块的分配所属人时候调用的
     */
    @Override
    public List<DeptNode> getDeptTree() {

        log.info("获取部门树,Service实现类开始运行");
        // 获取所有部门
        List<Dept> depts = deptMapper.selectAllDepts();
        log.info("数据库查询结果是" + depts);
        return buildDeptTree(depts);
    }

    @Override
    public List<Dept> getDeptList() {
        ArrayList<Dept> depts = new ArrayList<>();
        List<SysDept> sysDepts = sysDeptMapper.selectList(null);
        for (SysDept sysDept : sysDepts) {
            Dept dept = new Dept();
            BeanUtils.copyProperties(sysDept, dept);
            depts.add(dept);
        }
        return depts;
    }

    /**
     * 构建部门树（支持任意层级）
     */
    private List<DeptNode> buildDeptTree(List<Dept> depts) {
        log.info("开始构建部门树");
        Map<Long, DeptNode> nodeMap = new HashMap<>();
        List<DeptNode> rootNodes = new ArrayList<>();
        log.info("开始初始化节点");
        // 初始化所有节点
        for (Dept dept : depts) {
            DeptNode node = new DeptNode();
            node.setId(dept.getDeptId());
            node.setLabel(dept.getDeptName());
            node.setChildren(new ArrayList<>());
            nodeMap.put(node.getId(), node);
        }
        log.info("建立父子关系");
        // 建立父子关系
        for (Dept dept : depts) {
            DeptNode node = nodeMap.get(dept.getDeptId());
            if (dept.getParentId() == null || dept.getParentId() == 0) {
                rootNodes.add(node); // 根节点
            } else {
                DeptNode parentNode = nodeMap.get(dept.getParentId());
                if (parentNode != null) {
                    parentNode.getChildren().add(node);
                }
            }
        }

        log.info("对每个节点的 children 按照 id 排序");
        // 对每个节点的 children 按照 id 排序（可选）
        rootNodes.sort(Comparator.comparing(DeptNode::getId));
        sortChildrenRecursively(rootNodes);

        log.info("返回结果");
        return rootNodes;
    }

    /**
     * 递归排序子节点
     */
    private void sortChildrenRecursively(List<DeptNode> nodes) {
        for (DeptNode node : nodes) {
            if (node.getChildren() != null && !node.getChildren().isEmpty()) {
                node.getChildren().sort(Comparator.comparing(DeptNode::getId));
                sortChildrenRecursively(node.getChildren());
            }
        }
    }

    // 根据员工ID查询员工信息,作为归属人，UserServiceImpl实现类调用了该方法
    public String getOwner(Integer userId) {
        return deptMapper.getOwner(userId);
    }


    //      获取指定部门及其所有子部门的部门ID
    public List<Long> getAllDeptIdsInDeptAndSubDepts(Integer deptId) {
        List<Long> deptIds = new ArrayList<>();
        collectAllSubDeptIds(Long.valueOf(deptId), deptIds); // 收集当前部门及所有子部门的 ID
        return deptIds;
    }

    /**
     * 获取指定部门及其所有子部门的员工信息
     */
    public List<SysUser> getAllUsersInDeptAndSubDepts(Integer deptId) {
        List<Long> deptIds = getAllDeptIdsInDeptAndSubDepts(deptId); // 获取当前部门及所有子部门的 ID
        return deptMapper.selectAllUsersByDeptIds(deptIds); // 查询这些部门下的所有员工
    }


    /**
     * 递归收集指定部门及其所有子部门的 ID
     *
     * @param deptId  当前部门 ID
     * @param deptIds 存储部门 ID 的列表
     */
    private void collectAllSubDeptIds(Long deptId, List<Long> deptIds) {
        deptIds.add(deptId);
        List<Dept> subDepts = deptMapper.selectSubDeptsByParentId(deptId); // 查询当前部门的子部门
        for (Dept subDept : subDepts) {
            collectAllSubDeptIds(subDept.getDeptId(), deptIds); // 递归处理子部门
        }
    }

    public Dept selectById(Long deptId) {
        Dept dept = deptMapper.selectByDeptId(deptId);
        return dept;
    }
}
